/* 
定义用户相关的路由处理函数
*/
// 导入bcryptjs加密的包
const bcrypt = require("bcryptjs");
// 导入db对象
const db = require("../db/index");
// 导入生成token字符串的包
const jwt = require("jsonwebtoken");
// 导入config文件
const config = require("../config");

// 注册用户的处理函数
exports.regUser = (req, res) => {
  // 验证表单数据是否合法
  let { username, password } = req.body;
  if (!username || !password) {
    return res.cc("用户名或密码不能为空");
    // return res.send({ status: 1, message: "用户名或密码不能为空" });
  }
  // 验证账号是否被占用
  // 定义查询sql语句
  const sql = `select * from ev_users where username= ?`;
  // 执行查询sql语句
  db.query(sql, username, (err, result) => {
    if (err) {
      return res.cc(err);
      // return res.send({ status: 1, message: err.message });
    }
    if (result.length > 0) {
      return res.cc("账号已被注册，请重新注册！");
      // return res.send({ status: 1, message: "账号已被注册，请重新注册！" });
    }
  });
  // 插入新用户 -密码加密-
  // bcrypt.hashSync(明文密码，随机取的长度)
  password = bcrypt.hashSync(password, 10);
  // 定义插入的sql语句
  const insSql = `insert into ev_users set ?`;
  // 执行sql语句，插入新用户
  db.query(insSql, { username, password }, (err, result) => {
    // 执行sql语句失败
    if (err) {
      return res.cc(err);
      //return res.send({ status: 1, message: err.message });
    }
    // 执行sql语句成功，但影响条数不为1
    if (result.affectedRows !== 1) {
      return res.cc("注册用户失败，请稍后再试");
      // return res.send({ status: 1, message: "注册用户失败，请稍后再试" });
    }
    // 注册成功
    res.send({ status: 0, message: "注册成功！" });
  });
};

/* 
   登录：
1、接收表单数据
2、根据用户名去找数据库密码
3、密码比对，成功
4、生成token
*/

// 登录的处理函数
exports.login = (req, res) => {
  // 接收表单数据
  const userinfo = req.body;
  // 根据数据去数据库里面找对应信息
  const sql = `select * from ev_users where username= ?`;
  db.query(sql, userinfo.username, function (err, result) {
    // 执行sql语句失败
    if (err) return res.cc(err);
    // 执行sql语句成功，但是查询出来的数据条数不为1
    if (result.length !== 1) return res.cc("登录失败！");
    // 判断用户密码是否正确
    const compareResult = bcrypt.compareSync(
      userinfo.password,
      result[0].password
    );
    // 密码比对不通过
    if (!compareResult) return res.cc("密码输入错误！");
    // 通过- 生成token  要剔除密码和头像的值
    const user = { ...result[0], password: "", user_pic: "" };
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: "10h" }); //token的有效期为10个小时
    // 发送成功信息
    res.send({
      status: 0,
      message: "登录成功！",
      token: "Bearer" + tokenStr,
    });
  });
};
